package initialize

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"kuangstudy-mall/apis/user-web/global"
	"os"
	"time"
)

/*
*
日志初始化
*/
func InitLogger() {
	if *global.Args.Env == "dev" {
		logger, _ := zap.NewDevelopment()
		zap.ReplaceGlobals(logger)
	} else {
		lumberJackLogger := &lumberjack.Logger{
			Filename:   "./kva_info.log", // 日志文件位置
			MaxSize:    5,                // 进行切割之前，日志文件最大值(单位：MB)，默认100MB
			MaxBackups: 5,                // 保留旧文件的最大个数
			MaxAge:     1,                // 保留旧文件的最大天数
			Compress:   false,            // 是否压缩/归档旧文件
		}
		encoder := getEncoder()

		// 控制台数据
		consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
		consoleCore := zapcore.NewCore(consoleEncoder, zapcore.Lock(os.Stdout), zapcore.InfoLevel)
		// 文件输出
		syncer := zapcore.NewMultiWriteSyncer(zapcore.AddSync(lumberJackLogger))
		fileCore := zapcore.NewCore(encoder, syncer, zapcore.InfoLevel)
		// 重新初始化日志对象
		core := zapcore.NewTee(fileCore, consoleCore)
		logger := zap.New(core, zap.AddCaller())
		// 异步写入，这样在写入日志到文件的时候会重新开启一个协程去执行写入日志
		defer logger.Sync()
		// 替换全局的日志对象
		zap.ReplaceGlobals(logger)
	}
}

// json的方式输出
func getEncoder() zapcore.Encoder {
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = customTimeEncoder
	return zapcore.NewJSONEncoder(encoderConfig)
}

func customTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}
